vdbe.c文件中存放着VDBE的执行方法(sqlite3VdbeExec),这是VDBE的核心,也是SQLite的核心,SQL解析器生成一个程序然后由VDBE执行SQL语句的工作。VDBE程序在形式上类似于汇编语言。VDBC程序由一系列线性操作组成,每个操作都有1个操作码和5个操作数,操作数P1,P2,P3是整数,操作数P4是一个以null结尾的字符串,操作数P5是一个无符号字符。sqlite3VdbeExec函数用于解析VDBE程序指令,但 是要建立一个程序指令还需要其它文件里的函数的帮助和支撑。 下面是sqlite3VdbeExec函数的说明:
int sqlite3VdbeExec( Vdbe *p) { /* The VDBE */
int pc=0; /* 程序计数器 */
Op *aOp = p->aOp; /* p->aOp的复本 */
Op *pOp; /* 当前操作码 */
int rc = SQLITE_OK; /* 函数返回值 */
sqlite3 *db = p->db; /* 数据库 */
Mem *aMem = p->aMem; /* p->aMem的复本 */
Mem *pIn1 = 0; /* 第一次输入的参数 */
Mem *pIn2 = 0; /* 第二次输入的参数 */
Mem *pIn3 = 0; /* 第三次输入的参数 */
Mem *pOut = 0; /* 输出的参数*/
int iCompare = 0; /*存放操作码OP_Compare的操作结果*/
int *aPermute = 0; /*操作码OP_Compare使用的数组。*/
sqlite3VdbeEnter(p); /*初始化虚拟机程序p的环境*/
p->rc = SQLITE_OK;
p->pResultSet = 0;
db->busyHandler.nBusy = 0;
CHECK_FOR_INTERRUPT;
sqlite3VdbeIOTraceSql(p);
for(pc=p->pc; rc==SQLITE_OK; pc++){
pOp = &aOp[pc];
if( pOp->opflags & OPFLG_OUT2_PRERELEASE ){
assert( pOp->p2>0 );
assert( pOp->p2<=p->nMem );
pOut = &aMem[pOp->p2];
memAboutToChange(p, pOut);
VdbeMemRelease(pOut);
pOut->flags = MEM_Int;
}
switch( pOp->opcode ){
//switch语句,每一个case都是在VDBE里执行一个单独的指令,一共155个。
……
}
}